package com.springboot.scheduled.task;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * Spring Boot 定时器 demo
 *
 * （1）使用 @Async 注解,意义在于让串行任务，转成并行任务。要配合使用 @EnableAsync，
 * 不然设置的定时任务必须等待任务执行结束后再进行下一次任务的开启
 * 如：scheduled1() 方法，如果没有在配置类中使用 @EnableAsync，将会休眠3s后再进行下一次任务的开始
 *
 * （2）@Scheduled 定义定时任务的规则
 * 元素：
 *    cron: cron 表达式，设置定制任务的执行规则
 *    fixedDelay: 业务间隔时长循环执行
 *    ....
 */
//@Component
public class SpringTaskDemo {

    private static final Logger logger = LoggerFactory.getLogger(SpringTaskDemo.class);

    @Async // 设置成异步执行，下一次执行不需要等业务处理结束后再执行
    @Scheduled(cron = "0/1 * * * * *")
    public void scheduled1() throws InterruptedException {
        Thread.sleep(3000); // 模拟业务处理时长
        // 业务逻辑处理
        logger.info("第一个定时器，每秒执行一次，now={}", LocalDateTime.now());
    }

    @Scheduled(fixedDelay = 3000) // 间隔3秒执行一次
    public void scheduled2() {
        logger.info("第二个定时器, 间隔3秒执行一次，now={}", LocalDateTime.now());
    }
}
